package com.mjk.manager.satoken.conf;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpLogic;
import com.mjk.common.tools.springextend.BeeApplicationListener;
import com.mjk.manager.satoken.plugin.jwt.StpLogicJwtForSimple;
import com.mjk.manager.satoken.starter.spring.SaTokenContextForSpringInJakartaServlet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.event.ContextRefreshedEvent;

/**
 * satoken 配置类
 */
@Configuration
public class SaTokenConfigure implements BeeApplicationListener {

    @Bean
    @Primary
    public SaTokenConfig getSaTokenConfigPrimary() {
        SaTokenConfig config = new SaTokenConfig();
        // token 名称（同时也是 cookie 名称）
        config.setTokenName("satoken");
        // token 有效期（单位：秒），默认1天，-1代表永不过期
        config.setTimeout(1 * 24 * 60 * 60);
        // token 最低活跃频率（单位：秒），如果 token 超过此时间没有访问系统就会被冻结，默认-1 代表不限制，永不冻结
        config.setActiveTimeout(-1);
        // 是否允许同一账号多地同时登录（为 true 时允许一起登录，为 false 时新登录挤掉旧登录）
        config.setIsConcurrent(true);
        // 在多人登录同一账号时，是否共用一个 token （为 true 时所有登录共用一个 token，为 false 时每次登录新建一个 token）
        // 开启jwt 模式的时候会失效 StpLogicForSimple类里面返回了false
        config.setIsShare(true);
        // token 风格
        config.setTokenStyle("uuid");
        // 是否输出操作日志
        config.setIsLog(false);
        return config;
    }

    // Sa-Token 整合 jwt (Simple 简单模式)
//    @Bean
//    public StpLogic getStpLogicJwt() {
//        StpLogicJwtForSimple jwt = new StpLogicJwtForSimple();
//        jwt.setConfig(SaManager.getConfig());
//        return jwt;
//    }

    @Bean
    public StpInterface getStpInterface() {
        return new SaPermissionImpl();
    }
    /**
     * 容器刷新完成事件
     *
     * @param event
     */
    @Override
    public void doApplicationEvent(ContextRefreshedEvent event) {
        //定义satoken底层容器
        SaManager.setSaTokenContext(new SaTokenContextForSpringInJakartaServlet());
    }


}
